package persistencia;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import dominio.comun.Posicion;
import dominio.comun.sentidosMovimiento.SentidoAbajo;
import dominio.comun.sentidosMovimiento.SentidoArriba;
import dominio.comun.sentidosMovimiento.SentidoDerecha;
import dominio.comun.sentidosMovimiento.SentidoIzquierda;
import dominio.comun.sentidosMovimiento.SentidoMovimiento;
import dominio.fantasma.FantasmaFactory;
import dominio.fantasma.IFantasma;
import dominio.fantasma.IFantasmaFactory;
import dominio.fantasma.IFantasmaRepository;
import dominio.fantasma.estrategiasMovimiento.EstrategiaBuscador;
import dominio.fantasma.estrategiasMovimiento.EstrategiaBuscadorTemperamental;
import dominio.fantasma.estrategiasMovimiento.EstrategiaMovimiento;
import dominio.fantasma.estrategiasMovimiento.EstrategiaPerezoso;
import dominio.fantasma.estrategiasMovimiento.EstrategiaZonzo;
import dominio.laberinto.ICasillero;
import dominio.laberinto.Laberinto;

public class XMLFantasmaRepository implements IFantasmaRepository {

	private Element elemRaiz;

	public void setElemRaiz(Element elemRaiz) {
		this.elemRaiz = elemRaiz;
	}

	@Override
	public void guardar(IFantasma fantasma) {
		Element elemFantasma = DocumentHelper.createElement("fantasma");
		
		Attribute id = DocumentHelper.createAttribute(elemFantasma, "id", fantasma.getId());
		
		ICasillero casillero = Laberinto.getInstance().searchCasillero(fantasma.getPosicion());
		Attribute posicionFantasma = DocumentHelper.createAttribute(elemFantasma, "nodo", casillero.getId());
		
		Attribute fila = DocumentHelper.createAttribute(elemFantasma, "fila", String.valueOf(fantasma.getPosicion().getPosX()));
		Attribute columna = DocumentHelper.createAttribute(elemFantasma, "columna", String.valueOf(fantasma.getPosicion().getPosY()));
		
		String strSentido = null;
		if (fantasma.getSentidoMovimiento().getClass().getCanonicalName().contains("Izquierda")) {
			strSentido = "izquierda";
		}
		if (fantasma.getSentidoMovimiento().getClass().getCanonicalName().contains("Derecha")) {
			strSentido = "derecha";
		}
		if (fantasma.getSentidoMovimiento().getClass().getCanonicalName().contains("Arriba")) {
			strSentido = "arriba";
		}
		if (fantasma.getSentidoMovimiento().getClass().getCanonicalName().contains("Abajo")) {
			strSentido = "abajo";
		}
		Attribute sentido = DocumentHelper.createAttribute(elemFantasma, "sentido", strSentido);

		String strPersonalidad = null;
		if (fantasma.getEstrategiaMovimiento().getClass().getCanonicalName().contains("Perezoso")) {
			strPersonalidad = "perezoso";
		}
		if (fantasma.getEstrategiaMovimiento().getClass().getCanonicalName().contains("Zonzo")) {
			strPersonalidad = "zonzo";
		}
		if (fantasma.getEstrategiaMovimiento().getClass().getCanonicalName().contains("Buscador")) {
			strPersonalidad = "buscador";
		}
		if (fantasma.getEstrategiaMovimiento().getClass().getCanonicalName().contains("Temperamental")) {
			strPersonalidad = "buscadorT";
		}
		Attribute estrategiaMovimiento = DocumentHelper.createAttribute(elemFantasma, "personalidad", strPersonalidad);
		
		String strEstado = null;
		if (fantasma.getEstadoFantasma().getClass().getCanonicalName().contains("Cazador")) {
			strEstado = "cazador";
		}
		if (fantasma.getEstadoFantasma().getClass().getCanonicalName().contains("Presa")) {
			strEstado = "presa";
		}
		if (fantasma.getEstadoFantasma().getClass().getCanonicalName().contains("Muerto")) {
			strEstado = "muerto";
		}
		Attribute estado = DocumentHelper.createAttribute(elemFantasma, "estado", strEstado);
		
		elemFantasma.add(id);
		elemFantasma.add(posicionFantasma);
		elemFantasma.add(fila);
		elemFantasma.add(columna);
		elemFantasma.add(sentido);
		elemFantasma.add(estrategiaMovimiento);
		elemFantasma.add(estado);
		
		this.elemRaiz.add(elemFantasma);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<IFantasma> listar() {
		List<IFantasma> fantasmas = new ArrayList<IFantasma>();
		Iterator<Element> it = this.elemRaiz.elementIterator();
		while (it.hasNext()) {
			Element elem = it.next();
			IFantasma fantasma = this.cargar(elem);
			fantasmas.add(fantasma);
		}
		return fantasmas;
	}

	private IFantasma cargar(Element elem) {
		IFantasmaFactory fantasmaFactory = new FantasmaFactory();
		IFantasma fantasma = null;
		
		String id = elem.attributeValue("id");
		
		int fila = Integer.parseInt(elem.attributeValue("fila"));
		int columna = Integer.parseInt(elem.attributeValue("columna"));
		Posicion posicion = new Posicion(fila, columna);

		String strSentidoMovimiento = elem.attributeValue("sentido");
		SentidoMovimiento sentidoMovimiento = null;
		if (strSentidoMovimiento.equals("izquierda")) {
			sentidoMovimiento = new SentidoIzquierda();
		}
		if (strSentidoMovimiento.equals("derecha")) {
			sentidoMovimiento = new SentidoDerecha();
		}
		if (strSentidoMovimiento.equals("arriba")) {
			sentidoMovimiento = new SentidoArriba();
		}
		if (strSentidoMovimiento.equals("abajo")) {
			sentidoMovimiento = new SentidoAbajo();
		}

		String strEstrategiaMovimiento = elem.attributeValue("personalidad");
		EstrategiaMovimiento estrategiaMovimiento = null;
		if (strEstrategiaMovimiento.equals("perezoso")) {
			estrategiaMovimiento = new EstrategiaPerezoso();
		}
		if (strEstrategiaMovimiento.equals("zonzo")) {
			estrategiaMovimiento = new EstrategiaZonzo();
		}
		if (strEstrategiaMovimiento.equals("buscador")) {
			estrategiaMovimiento = new EstrategiaBuscador();
		}
		if (strEstrategiaMovimiento.equals("buscadorT")) {
			estrategiaMovimiento = new EstrategiaBuscadorTemperamental();
		}
		
		String estado = elem.attributeValue("estado");
		if (estado.equals("cazador")) {
			fantasma = fantasmaFactory.crearFantasmaCazador(id, estrategiaMovimiento, sentidoMovimiento, posicion);
		}
		if (estado.equals("presa")) {
			fantasma = fantasmaFactory.crearFantasmaPresa(id, estrategiaMovimiento, sentidoMovimiento, posicion);
		}
		if (estado.equals("muerto")) {
			fantasma = fantasmaFactory.crearFantasmaMuerto(id, estrategiaMovimiento, sentidoMovimiento, posicion);
		}
		
		return fantasma;
	}
	
}
